몬테카를로 방법 ( Monte Carlo method ) 을 통해 원 넓이를 근사적으로 구하고
matplotlib과 ploty 시각화 도구를 사용해서 직관적으로 이해하자.
학창시절 우리는 원넓이를 구할 때 $\pi$$r^{2}$을 외우고 구했다. ( 대부분 이랬을거라 믿는다 )
본인은 대학생 신분일 시절 몬테카를로 방법에 대해 배우고
'원 넓이를 이렇게도 구할수 있구나' 라는 신선한 충격을 받았다.
몬테카를로 방법으로 원 넓이를 구하는 것을 처음 보는 분들은
나와 같은 충격을 받기를 바라며
이미 알고 있었던 분들은 시각화 도구로 어떻게 나타냈는가 보고 가시길
몬테카를로 방법(Monte Carlo method)은 난수를 이용하여
함수의 값을 확률적으로 계산하는 알고리즘을 부르는 용어이다.
수학이나 물리학 등에 자주 사용되며, 계산하려는 값이 닫힌 형식으로 표현되지 않거나
복잡한 경우에 근사적으로 계산할 때 사용된다. - 네이버 지식백과
몬테카를로 방법은 쉽게 말해서 랜덤한 값으로 값을 확률적으로 계산하는 방법이다.
우리는 이 방법으로 반지름의 길이가 1인 원의 넓이를 구할 것이다.
먼저 우리가 배운 공식에 따르면 반지름의 길이가 1인 원의 넓이는
( $\pi$$r^{2}$ 공식에 따르면 ) $\pi$ , 3.141592····이다.
먼저
가로, 세로의 길이가 1인 도화지에 4등분한 원을 그려놓고
점을 무작위로 마구 찍은 다음
원안에 그려진 점의 개수를 보고 원의 넓이를 추정한다.
정확하게는
( 원 안에있는 점의 수 / 전체 찍은 점의 수 ) 하면
사분원 안에 점이 찍힐 확률이 나오고
위의 확률 * 4 를 하면 원 안에 점이 찍힐 확률을 구할 수 있는데
점의 개수를 무한히 늘린다면 이것은 원 넓이에 근사해진다는 것을 이용해
원 넓이를 구할 것이다.
내가 설명을 잘못해서 이해하기 어렵다면 ( 죄송합니다 )
직접 눈으로 확인해보자
백문이불여일견.
먼저 좌표평면에 반지름의 길이가 1인 사분원을 하나 그린다
다음의 코드를 사용해서 무작위로 점을 찍는다.
x_dot = np.random.rand(n)
y_dot = np.random.rand(n)
먼저 점 100개를 찍어보겠다.
원 안에 점이 있을 확률 : 0.74 원 넓이 : 2.96
원 밖의 점은 빨간색으로 원 안의 점은 파랑색으로 나타냈다.
100개의 점중에 원 안에 있는 점의 개수를 세어
원안에 점이 있을 확률을 구하고
이 값에 곱하기 4를하면 추정한 원의 넓이가 나온다.
점의 개수가 늘어날수록
무작위로 찍은점이 원 안에 있을 확률이 곧 원의 넓이와 비슷해진다는 것이다.
점의 수를 점점 늘려 보겠다.
원 안에 점이 있을 확률 : 0.792 원 넓이 : 3.168
원 안에 점이 있을 확률 : 0.764 원 넓이 : 3.056
원 안에 점이 있을 확률 : 0.7883 원 넓이 : 3.1532
차례대로 500개, 1000개, 10000개의 점을 찍었을 때 그림이다.
위의 방식 처럼 수를 늘려가다 보면
확률적으로 원의 넓이를 추청할 수 있었다.
plotly 를 이용한 방법도 위 matplotlib 방식과 동일하다.
원 안에 있을 확률 : 0.78 원 넓이 : 3.12
원 안에 있을 확률 : 0.794 원 넓이 : 3.176
원 안에 있을 확률 : 0.779 원 넓이 : 3.116
원 안에 있을 확률 : 0.7867 원 넓이 : 3.1468
다시 정의로 돌아가서...
몬테카를로 방법은 무작위 값을 이용하여 함수의 값을 확률적으로 계산하는 방법이다.
계산하려는 값이 닫힌 형식으로 표현되지 않거나 복잡한 경우에 근사적으로 계산할 때 사용된다.
어떤가 눈으로 직접 보고나니까 더 쉽게 다가오지 않는가
여러분도 신선한 충격을 받았길 바라며 스토리를 마무리 하겠다.
이름이 몬테카를로 방법인 이유는
이 방법을 고안한 수학자 스타니스와프 울람이
도박에서 엄청나게 많은 수의 게임을 했을때 승률을 알아보고자 했는데
여기에서 영감을 얻어 도박으로 유명한 모나코의 몬테카를로 도시의 이름을 붙였다.